﻿namespace _H指数
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Solution.HIndex(new int[] { 10, 8, 5, 4, 3 }));
        }
    }
    /*
     * 给你一个整数数组 citations ，其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

根据维基百科上 h 指数的定义：h 代表“高引用次数” ，一名科研人员的 h 指数 是指他（她）至少发表了 h 篇论文，并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值，h 指数 是其中最大的那个。.

    当我们计算研究者的h指数时，我们需要找到一个最大的h值，满足以下两个条件：

    有h篇论文的引用次数大于等于h。
    剩余的（n-h）篇论文的引用次数都小于h。

为了实现这一目标，我们首先对引用次数数组进行排序。排序后的数组将按照引用次数的升序排列。

然后，我们遍历排序后的数组。对于每个引用次数citations[i]，我们检查是否存在至少citations[i]篇论文的引用次数大于等于citations[i]。我们可以通过比较引用次数citations[i]和剩余的论文数量（n - i）来判断是否满足这个条件。如果满足，我们就更新候选的h指数值。

在遍历过程中，我们始终保持最大的候选h指数值。最终，我们将这个最大的候选值作为计算得到的h指数返回。



     * */

    public class Solution
    {
        public static int HIndex(int[] citations)
        {
            Array.Sort(citations);
            int n = citations.Length;
            int h = 0;
            for (int i = 0; i < n; i++)
            {
                if (citations[i] >= n - i)// 至少有 citations[i] 篇论文的引用次数大于等于 citations[i]
                {
                    h = Math.Max(h, n - i);  // 更新候选的 h 指数值
                }
            }
            return h;
        }
        public int HIndex1(int[] citations)
        {
            Array.Sort(citations);
            int h = 0, i = citations.Length - 1;
            while (i >= 0 && citations[i] > h)
            {
                h++;
                i--;
            }
            return h;
        }
    }
}
